package org.opencms.free.balance.listener;

import java.util.List;

import org.opencms.configuration.CmsConfigurationManager;
import org.opencms.db.CmsPublishList;
import org.opencms.file.CmsObject;
import org.opencms.free.balance.BalanceFreeNode;
import org.opencms.free.balance.BalanceFreeNodeDao;
import org.opencms.free.balance.BalanceFreeNodeDaoImpl;
import org.opencms.free.balance.client.BalanceClientFacade;
import org.opencms.main.CmsEvent;
import org.opencms.main.I_CmsEventListener;
import org.opencms.main.OpenCms;
import org.opencms.module.CmsModule;
import org.opencms.module.I_CmsModuleAction;
import org.opencms.report.I_CmsReport;
import org.opencms.workplace.list.CmsListItem;

import edu.emory.mathcs.backport.java.util.Arrays;

/**
 * Clase encargada de registrar el listener al instalar el módulo.
 */
public class BalanceListener implements I_CmsModuleAction {

	/**
	 * CmsObject.
	 */
	private CmsObject cmsObject;

	/**
	 * Array de eventos ante los que tiene que responder el listener.
	 */
	private int[] listEvents;

	/**
	 * Método encargado de registrar el listener de sincronizacion.
	 */
	public void initialize(final CmsObject cmsObject,
			final CmsConfigurationManager configurationManager,
			final CmsModule module) {
		this.cmsObject = cmsObject;
		// Listado de eventos ante los que tiene que responder
		// el listener
		this.listEvents = new int[] {
				I_CmsEventListener.EVENT_RESOURCE_CREATED,
				I_CmsEventListener.EVENT_RESOURCE_MODIFIED,
				I_CmsEventListener.EVENT_RESOURCE_MOVED,
				I_CmsEventListener.EVENT_RESOURCE_COPIED,
				I_CmsEventListener.EVENT_RESOURCE_DELETED,
				I_CmsEventListener.EVENT_RESOURCES_MODIFIED,
				I_CmsEventListener.EVENT_RESOURCE_AND_PROPERTIES_MODIFIED,
				I_CmsEventListener.EVENT_RESOURCES_AND_PROPERTIES_MODIFIED };
		// Se registra el listener
		OpenCms.addCmsEventListener(this, this.listEvents);
	}

	/**
	 * Se elimina el listener.
	 */
	public void moduleUninstall(CmsModule module) {
		OpenCms.removeCmsEventListener(this);
	}

	/**
	 * Se actualiza el listener.
	 */
	public void moduleUpdate(CmsModule module) {
	}

	/**
	 * Se publica un proyecto
	 */
	public void publishProject(CmsObject cmsObject, CmsPublishList list,
			int tag, I_CmsReport report) {
		// Do nothing
	}

	/**
	 * Se apaga OpenCms.
	 */
	public void shutDown(CmsModule arg0) {
	}

	/**
	 * Se captura el evento.
	 */
	public void cmsEvent(final CmsEvent event) {
		// Se comprueba si se ha de limpiar la cache de los nodos del cluster.
		if (Arrays.binarySearch(this.listEvents, event.getType()) >= 0) {
			// Se obtiene el listado de nodos.
			BalanceFreeNodeDao nodeDao = new BalanceFreeNodeDaoImpl();
			List<BalanceFreeNode> listNodes = nodeDao.findAllNodes();
			for (BalanceFreeNode node : listNodes) {
				// TODO: El nodo que ejecuta este metodo no se ha de limpiar.
				// Se van limpiando los nodos lista
				// TODO: Incluir usuario y contraseña
				BalanceClientFacade.reloadCache(
						node.getNodeUrl(),
						"", "");
			}
		}
	}
}